//
//  HomeViewController.swift
//  xinlangweibo
//
//  Created by yangshuo on 15/11/23.
//  Copyright © 2015年 yangshuo. All rights reserved.
//

import UIKit
import SVProgressHUD
//微博 cell的可重用表示符号
 let StatusCellNormalId = "StatusCellNormalId"
//转发微博可重用id
let StatusRetweetedCellID = "StatusRetweetedCellID"
class HomeViewController: VisitorTableViewController {
    //微博数据列表模型
    private lazy var listViewModel = StatusListViewModel()
      //微博数据数组
    // var arrayM: [Status]?

    override func viewDidLoad() {
        super.viewDidLoad()
        if !UserAccountViewModel.sharedUserAccount.userLoad{
        visitorView?.setupInfo(nil, title: "关注一些人，回这里看看有什么惊喜")
            return
        }
        prefareTableView()
        homeLoadData()
    }
    
    //准备表格(tableView预设)
    private func prefareTableView() {
        //注册可重用cell
        //注意使用自定义的cell这里需要改成一下xxx.self
        tableView.registerClass(StatusRetweetedCell.self, forCellReuseIdentifier: StatusRetweetedCellID)
        //取消分割线显示
        tableView.separatorStyle = .None
        
        //自动计算行高:三部曲
        //第一步:预估行高
        tableView.estimatedRowHeight = 400
        //第二步自动计算行高
       // tableView.rowHeight = 400
    }
    private func homeLoadData(){
        //直接调用MVVM中的方法
     listViewModel.loadStatus { (isSuccessed) -> () in
        if !isSuccessed{
           SVProgressHUD.showWithStatus("数据加载有误!")
            return
        }
        self.tableView.reloadData()
        
        }
    }
}
//        NetWork.sharedNetWork.loadData({ (success) -> () in
//            //判断success的数据结构是否正确,所以success不能强解而使用?
//            //success数据是一个大的字典,而statuses是success中的一个键,它本身是一个数组
//           guard let array = success?["statuses"] as? [[String: AnyObject]] else{
//        print("格式错误")
//       return
//            }
//            //字典转模型
//            // 实例化一个可变数组  模型类名[Status]()
//            var arrayM = [Status]()
//            //遍历数组
//            for dict in array{
//                arrayM .append(Status(dict: dict))
//            }
//            self.arrayM = arrayM
////            self.tableView.reloadData()
//            //测试
//            print(arrayM)
//   
//            
//            }) { (error) -> () in
//                print("~~出错了~~\(error)")
//        }
//    }


//数据源方法
extension HomeViewController{
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //为什么打印的是nil??
       // print(arrayM?.count)
       return listViewModel.StatusList.count
    }
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //不会调用cell的行高方法
       // let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellNormalId)
        //取cell,会调用cell的行高方法
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusRetweetedCellID, forIndexPath: indexPath) as! StatusCell
        //设置cell文本,注意这里是[]arrayM是数组[]
        cell.viewModel = listViewModel.StatusList[indexPath.row]
        return cell
    }
    
    /**------设置了预估行高-------
    //当前显示的行高方法会调用三次(根据Xcode版本不同会有变动)
    
    //注意:预估行高的高度不同,计算次数不同
    1.使用预估行高,计算contentsize
     2.根据预估行高,判断计算次数,顺序计算每一行的行高,更新contentsize
     3.如果预估过大,超出预估范围,顺序计算后续行高,一直到填满屏幕退出,同时更新contentsize
     4.使用预估行高,每个cell显示之前需要计算,单个cell的效率是低的,从整体上效率是高!(如果有100个cell,用户看到第10个cell退出)
    执行顺序: 行数 -> cell->行高
     预估要靠近!`
    */
    
    
    /**-------没有设置预估行高-------
     1.计算所有行的高度
     2.在计算显示行的高度
     
     执行顺序: 行数->行高->cell
     为什么没有预估行高要调用所有行高方法? UITableview继承自UIScrollview
     表格视图滚动非常流畅->需要提前计算出contentsize,而contentsize需要有预估行高才可以进行计算
     苹果官方文档支出,如果行高是固定值,就不要实现行高代理方法
      */
    
    //降低行高被调用的次数,需要使用行高缓存,
     //注意实际开发中,一定要使用行高缓存!!!
    //修改cell行高的代理方法
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        //先获取cell的视图模型
        let vm = listViewModel.StatusList[indexPath.row]
        //行高缓存判断
        if vm.rowHeight != nil{
            //因为在定义属性是CGFloat是可选,所以这里vm.rowHeight!需要强行解包
            return vm.rowHeight!
        }
        print("缓存行高\(vm.status.text)")
        //将模型视图丢给cell->然后在cell的控制器中调用rowheight函数
        let cell = StatusRetweetedCell(style: .Default, reuseIdentifier: StatusRetweetedCellID)
        
       vm.rowHeight = cell.rowHeight(vm)
        //返回rowheight函数的结果
        return vm.rowHeight!
        
/**---------------- 懒加载缓存行高--------------
     //   写了StatusViewModel视图模型中vm的懒加载属性->然后调用该属性的懒加载方法
       let vm = listViewModel.StatusList[indexPath.row]
       return vm.rowHeight
----------------------------------------------*/
    }
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("123")
    }
}

